--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
sbapp/pydub/utils.py f8b3e3760b831745cf10d97aeae64e9c00a136a9 (f8b3e376) Text, 12.37 KB
Tff7b72from T7ee787__future__ Tff7b72import Te6edf3division
Tff7b72import T7ee787json
Tff7b72import T7ee787os
Tff7b72import T7ee787re
Tff7b72import T7ee787sys
Tff7b72from T7ee787subprocess Tff7b72import Te6edf3PopenTb4b4b4, Te6edf3PIPE
Tff7b72from T7ee787math Tff7b72import Te6edf3logTb4b4b4, Te6edf3ceil
Tff7b72from T7ee787tempfile Tff7b72import Te6edf3TemporaryFile
Tff7b72from T7ee787warnings Tff7b72import Te6edf3warn
Tff7b72from T7ee787functools Tff7b72import Te6edf3wraps
Tff7b72tryTb4b4b4:
Tff7b72import T7ee787audioop
Tff7b72except Tf85149ImportErrorTb4b4b4:
Tff7b72import T7ee787pyaudioop Tff7b72as T7ee787audioop
Tff7b72if Te6edf3sysTff7b72.Td2a8ffversion_info Tff7b72>Tff7b72= Tb4b4b4(T79c0ff3Tb4b4b4, T79c0ff0Tb4b4b4)Tb4b4b4:
Te6edf3basestring Tff7b72= Tffa657str
Te6edf3FRAME_WIDTHS Tff7b72= Tb4b4b4{
T79c0ff8Tb4b4b4: T79c0ff1Tb4b4b4,
T79c0ff16Tb4b4b4: T79c0ff2Tb4b4b4,
T79c0ff32Tb4b4b4: T79c0ff4Tb4b4b4,
Tb4b4b4}
Te6edf3ARRAY_TYPES Tff7b72= Tb4b4b4{
T79c0ff8Tb4b4b4: Ta5d6ff"Ta5d6ffbTa5d6ff"Tb4b4b4,
T79c0ff16Tb4b4b4: Ta5d6ff"Ta5d6ffhTa5d6ff"Tb4b4b4,
T79c0ff32Tb4b4b4: Ta5d6ff"Ta5d6ffiTa5d6ff"Tb4b4b4,
Tb4b4b4}
Te6edf3ARRAY_RANGES Tff7b72= Tb4b4b4{
T79c0ff8Tb4b4b4: Tb4b4b4(Tff7b72-T79c0ff0x80Tb4b4b4, T79c0ff0x7fTb4b4b4)Tb4b4b4,
T79c0ff16Tb4b4b4: Tb4b4b4(Tff7b72-T79c0ff0x8000Tb4b4b4, T79c0ff0x7fffTb4b4b4)Tb4b4b4,
T79c0ff32Tb4b4b4: Tb4b4b4(Tff7b72-T79c0ff0x80000000Tb4b4b4, T79c0ff0x7fffffffTb4b4b4)Tb4b4b4,
Tb4b4b4}
Tff7b72def Td2a8ffget_frame_widthTb4b4b4(Te6edf3bit_depthTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3FRAME_WIDTHSTb4b4b4[Te6edf3bit_depthTb4b4b4]
Tff7b72def Td2a8ffget_array_typeTb4b4b4(Te6edf3bit_depthTb4b4b4, Te6edf3signedTff7b72=Tff7b72TrueTb4b4b4)Tb4b4b4:
Te6edf3t Tff7b72= Te6edf3ARRAY_TYPESTb4b4b4[Te6edf3bit_depthTb4b4b4]
Tff7b72if Tff7b72not Te6edf3signedTb4b4b4:
Te6edf3t Tff7b72= Te6edf3tTff7b72.Td2a8ffupperTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3t
Tff7b72def Td2a8ffget_min_max_valueTb4b4b4(Te6edf3bit_depthTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3ARRAY_RANGESTb4b4b4[Te6edf3bit_depthTb4b4b4]
Tff7b72def Td2a8ff_fd_or_path_or_tempfileTb4b4b4(Te6edf3fdTb4b4b4, Te6edf3modeTff7b72=Ta5d6ff'Ta5d6ffw+bTa5d6ff'Tb4b4b4, Te6edf3tempfileTff7b72=Tff7b72TrueTb4b4b4)Tb4b4b4:
Te6edf3close_fd Tff7b72= Tff7b72False
Tff7b72if Te6edf3fd Tff7b72is Tff7b72None Tff7b72and Te6edf3tempfileTb4b4b4:
Te6edf3fd Tff7b72= Te6edf3TemporaryFileTb4b4b4(Te6edf3modeTff7b72=Te6edf3modeTb4b4b4)
Te6edf3close_fd Tff7b72= Tff7b72True
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3fdTb4b4b4, Te6edf3basestringTb4b4b4)Tb4b4b4:
Te6edf3fd Tff7b72= Tffa657openTb4b4b4(Te6edf3fdTb4b4b4, Te6edf3modeTff7b72=Te6edf3modeTb4b4b4)
Te6edf3close_fd Tff7b72= Tff7b72True
Tff7b72tryTb4b4b4:
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3fdTb4b4b4, Te6edf3osTff7b72.Td2a8ffPathLikeTb4b4b4)Tb4b4b4:
Te6edf3fd Tff7b72= Tffa657openTb4b4b4(Te6edf3fdTb4b4b4, Te6edf3modeTff7b72=Te6edf3modeTb4b4b4)
Te6edf3close_fd Tff7b72= Tff7b72True
Tff7b72except Tf85149AttributeErrorTb4b4b4:
T8b949e# module os has no attribute PathLike, so we're on python < 3.6.
T8b949e# The protocol we're trying to support doesn't exist, so just pass.
Tff7b72pass
Tff7b72return Te6edf3fdTb4b4b4, Te6edf3close_fd
Tff7b72def Td2a8ffdb_to_floatTb4b4b4(Te6edf3dbTb4b4b4, Te6edf3using_amplitudeTff7b72=Tff7b72TrueTb4b4b4)Tb4b4b4:
T8b949e"""
Converts the input db to a float, which represents the equivalent
ratio in power.
"""
Te6edf3db Tff7b72= Tffa657floatTb4b4b4(Te6edf3dbTb4b4b4)
Tff7b72if Te6edf3using_amplitudeTb4b4b4:
Tff7b72return T79c0ff10 Tff7b72*Tff7b72* Tb4b4b4(Te6edf3db Tff7b72/ T79c0ff20Tb4b4b4)
Tff7b72elseTb4b4b4: T8b949e# using power
Tff7b72return T79c0ff10 Tff7b72*Tff7b72* Tb4b4b4(Te6edf3db Tff7b72/ T79c0ff10Tb4b4b4)
Tff7b72def Td2a8ffratio_to_dbTb4b4b4(Te6edf3ratioTb4b4b4, Te6edf3val2Tff7b72=Tff7b72NoneTb4b4b4, Te6edf3using_amplitudeTff7b72=Tff7b72TrueTb4b4b4)Tb4b4b4:
T8b949e"""
Converts the input float to db, which represents the equivalent
to the ratio in power represented by the multiplier passed in.
"""
Te6edf3ratio Tff7b72= Tffa657floatTb4b4b4(Te6edf3ratioTb4b4b4)
T8b949e# accept 2 values and use the ratio of val1 to val2
Tff7b72if Te6edf3val2 Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3ratio Tff7b72= Te6edf3ratio Tff7b72/ Te6edf3val2
T8b949e# special case for multiply-by-zero (convert to silence)
Tff7b72if Te6edf3ratio Tff7b72== T79c0ff0Tb4b4b4:
Tff7b72return Tff7b72-Tffa657floatTb4b4b4(Ta5d6ff'Ta5d6ffinfTa5d6ff'Tb4b4b4)
Tff7b72if Te6edf3using_amplitudeTb4b4b4:
Tff7b72return T79c0ff20 Tff7b72* Te6edf3logTb4b4b4(Te6edf3ratioTb4b4b4, T79c0ff10Tb4b4b4)
Tff7b72elseTb4b4b4: T8b949e# using power
Tff7b72return T79c0ff10 Tff7b72* Te6edf3logTb4b4b4(Te6edf3ratioTb4b4b4, T79c0ff10Tb4b4b4)
Tff7b72def Td2a8ffregister_pydub_effectTb4b4b4(Te6edf3fnTb4b4b4, Te6edf3nameTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
T8b949e"""
decorator for adding pydub effects to the AudioSegment objects.
example use:
@register_pydub_effect
def normalize(audio_segment):
...
or you can specify a name:
@register_pydub_effect("normalize")
def normalize_audio_segment(audio_segment):
...
"""
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3fnTb4b4b4, Te6edf3basestringTb4b4b4)Tb4b4b4:
Te6edf3name Tff7b72= Te6edf3fn
Tff7b72return Tff7b72lambda Te6edf3fnTb4b4b4: Te6edf3register_pydub_effectTb4b4b4(Te6edf3fnTb4b4b4, Te6edf3nameTb4b4b4)
Tff7b72if Te6edf3name Tff7b72is Tff7b72NoneTb4b4b4:
Te6edf3name Tff7b72= Te6edf3fnTff7b72.Td2a8ff__name__
Tff7b72from T7ee787.T7ee787audio_segment Tff7b72import Te6edf3AudioSegment
Tffa657setattrTb4b4b4(Te6edf3AudioSegmentTb4b4b4, Te6edf3nameTb4b4b4, Te6edf3fnTb4b4b4)
Tff7b72return Te6edf3fn
Tff7b72def Td2a8ffmake_chunksTb4b4b4(Te6edf3audio_segmentTb4b4b4, Te6edf3chunk_lengthTb4b4b4)Tb4b4b4:
T8b949e"""
Breaks an AudioSegment into chunks that are <chunk_length> milliseconds
long.
if chunk_length is 50 then you'll get a list of 50 millisecond long audio
segments back (except the last one, which can be shorter)
"""
Te6edf3number_of_chunks Tff7b72= Te6edf3ceilTb4b4b4(Tffa657lenTb4b4b4(Te6edf3audio_segmentTb4b4b4) Tff7b72/ Tffa657floatTb4b4b4(Te6edf3chunk_lengthTb4b4b4)Tb4b4b4)
Tff7b72return Tb4b4b4[Te6edf3audio_segmentTb4b4b4[Te6edf3i Tff7b72* Te6edf3chunk_lengthTb4b4b4:Tb4b4b4(Te6edf3i Tff7b72+ T79c0ff1Tb4b4b4) Tff7b72* Te6edf3chunk_lengthTb4b4b4]
Tff7b72for Te6edf3i Tff7b72in Tffa657rangeTb4b4b4(Tffa657intTb4b4b4(Te6edf3number_of_chunksTb4b4b4)Tb4b4b4)Tb4b4b4]
Tff7b72def Td2a8ffwhichTb4b4b4(Te6edf3programTb4b4b4)Tb4b4b4:
T8b949e"""
Mimics behavior of UNIX which command.
"""
T8b949e# Add .exe program extension for windows support
Tff7b72if Te6edf3osTff7b72.Td2a8ffname Tff7b72== Ta5d6ff"Ta5d6ffntTa5d6ff" Tff7b72and Tff7b72not Te6edf3programTff7b72.Td2a8ffendswithTb4b4b4(Ta5d6ff"Ta5d6ff.exeTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3program Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff.exeTa5d6ff"
Te6edf3envdir_list Tff7b72= Tb4b4b4[Te6edf3osTff7b72.Td2a8ffcurdirTb4b4b4] Tff7b72+ Te6edf3osTff7b72.Td2a8ffenvironTb4b4b4[Ta5d6ff"Ta5d6ffPATHTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffsplitTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathsepTb4b4b4)
Tff7b72for Te6edf3envdir Tff7b72in Te6edf3envdir_listTb4b4b4:
Te6edf3program_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3envdirTb4b4b4, Te6edf3programTb4b4b4)
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3program_pathTb4b4b4) Tff7b72and Te6edf3osTff7b72.Td2a8ffaccessTb4b4b4(Te6edf3program_pathTb4b4b4, Te6edf3osTff7b72.Td2a8ffX_OKTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3program_path
Tff7b72def Td2a8ffget_encoder_nameTb4b4b4(Tb4b4b4)Tb4b4b4:
T8b949e"""
Return enconder default application for system, either avconv or ffmpeg
"""
Tff7b72if Te6edf3whichTb4b4b4(Ta5d6ff"Ta5d6ffavconvTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffavconvTa5d6ff"
Tff7b72elif Te6edf3whichTb4b4b4(Ta5d6ff"Ta5d6ffffmpegTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffffmpegTa5d6ff"
Tff7b72elseTb4b4b4:
T8b949e# should raise exception
Te6edf3warnTb4b4b4(Ta5d6ff"Ta5d6ffCouldnTa5d6ff'Ta5d6fft find ffmpeg or avconv - defaulting to ffmpeg, but may not workTa5d6ff"Tb4b4b4, Tf85149RuntimeWarningTb4b4b4)
Tff7b72return Ta5d6ff"Ta5d6ffffmpegTa5d6ff"
Tff7b72def Td2a8ffget_player_nameTb4b4b4(Tb4b4b4)Tb4b4b4:
T8b949e"""
Return enconder default application for system, either avconv or ffmpeg
"""
Tff7b72if Te6edf3whichTb4b4b4(Ta5d6ff"Ta5d6ffavplayTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffavplayTa5d6ff"
Tff7b72elif Te6edf3whichTb4b4b4(Ta5d6ff"Ta5d6ffffplayTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffffplayTa5d6ff"
Tff7b72elseTb4b4b4:
T8b949e# should raise exception
Te6edf3warnTb4b4b4(Ta5d6ff"Ta5d6ffCouldnTa5d6ff'Ta5d6fft find ffplay or avplay - defaulting to ffplay, but may not workTa5d6ff"Tb4b4b4, Tf85149RuntimeWarningTb4b4b4)
Tff7b72return Ta5d6ff"Ta5d6ffffplayTa5d6ff"
Tff7b72def Td2a8ffget_prober_nameTb4b4b4(Tb4b4b4)Tb4b4b4:
T8b949e"""
Return probe application, either avconv or ffmpeg
"""
Tff7b72if Te6edf3whichTb4b4b4(Ta5d6ff"Ta5d6ffavprobeTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffavprobeTa5d6ff"
Tff7b72elif Te6edf3whichTb4b4b4(Ta5d6ff"Ta5d6ffffprobeTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffffprobeTa5d6ff"
Tff7b72elseTb4b4b4:
T8b949e# should raise exception
Te6edf3warnTb4b4b4(Ta5d6ff"Ta5d6ffCouldnTa5d6ff'Ta5d6fft find ffprobe or avprobe - defaulting to ffprobe, but may not workTa5d6ff"Tb4b4b4, Tf85149RuntimeWarningTb4b4b4)
Tff7b72return Ta5d6ff"Ta5d6ffffprobeTa5d6ff"
Tff7b72def Td2a8fffsdecodeTb4b4b4(Te6edf3filenameTb4b4b4)Tb4b4b4:
T8b949e"""Wrapper for os.fsdecode which was introduced in python 3.2 ."""
Tff7b72if Te6edf3sysTff7b72.Td2a8ffversion_info Tff7b72>Tff7b72= Tb4b4b4(T79c0ff3Tb4b4b4, T79c0ff2Tb4b4b4)Tb4b4b4:
Te6edf3PathLikeTypes Tff7b72= Tb4b4b4(Te6edf3basestringTb4b4b4, Tffa657bytesTb4b4b4)
Tff7b72if Te6edf3sysTff7b72.Td2a8ffversion_info Tff7b72>Tff7b72= Tb4b4b4(T79c0ff3Tb4b4b4, T79c0ff6Tb4b4b4)Tb4b4b4:
Te6edf3PathLikeTypes Tff7b72+Tff7b72= Tb4b4b4(Te6edf3osTff7b72.Td2a8ffPathLikeTb4b4b4,Tb4b4b4)
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3filenameTb4b4b4, Te6edf3PathLikeTypesTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3osTff7b72.Td2a8fffsdecodeTb4b4b4(Te6edf3filenameTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3filenameTb4b4b4, Tffa657bytesTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3filenameTff7b72.Td2a8ffdecodeTb4b4b4(Te6edf3sysTff7b72.Td2a8ffgetfilesystemencodingTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3filenameTb4b4b4, Te6edf3basestringTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3filename
Tff7b72raise Tf85149TypeErrorTb4b4b4(Ta5d6ff"Ta5d6fftype Tffd700{0}Ta5d6ff not accepted by fsdecodeTa5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Tffa657typeTb4b4b4(Te6edf3filenameTb4b4b4)Tb4b4b4)Tb4b4b4)
Tff7b72def Td2a8ffget_extra_infoTb4b4b4(Te6edf3stderrTb4b4b4)Tb4b4b4:
T8b949e"""
avprobe sometimes gives more information on stderr than
on the json output. The information has to be extracted
from stderr of the format of:
' Stream #0:0: Audio: flac, 88200 Hz, stereo, s32 (24 bit)'
or (macOS version):
' Stream #0:0: Audio: vorbis'
' 44100 Hz, stereo, fltp, 320 kb/s'
:type stderr: str
:rtype: list of dict
"""
Te6edf3extra_info Tff7b72= Tb4b4b4{Tb4b4b4}
Te6edf3re_stream Tff7b72= Ta5d6ffrTa5d6ff'Ta5d6ff(?P<space_start> +)Stream #0[:Ta5d6ff\Ta5d6ff.](?P<stream_id>([0-9]+))(?P<content_0>.+)Ta5d6ff\Ta5d6ffn?(?! *Stream)((?P<space_end> +)(?P<content_1>.+))?Ta5d6ff'
Tff7b72for Te6edf3i Tff7b72in Te6edf3reTff7b72.Td2a8fffinditerTb4b4b4(Te6edf3re_streamTb4b4b4, Te6edf3stderrTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3iTff7b72.Td2a8ffgroupTb4b4b4(Ta5d6ff'Ta5d6ffspace_endTa5d6ff'Tb4b4b4) Tff7b72is Tff7b72not Tff7b72None Tff7b72and Tffa657lenTb4b4b4(Te6edf3iTff7b72.Td2a8ffgroupTb4b4b4(Ta5d6ff'Ta5d6ffspace_startTa5d6ff'Tb4b4b4)Tb4b4b4) Tff7b72<Tff7b72= Tffa657lenTb4b4b4(
Te6edf3iTff7b72.Td2a8ffgroupTb4b4b4(Ta5d6ff'Ta5d6ffspace_endTa5d6ff'Tb4b4b4)Tb4b4b4)Tb4b4b4:
Te6edf3content_line Tff7b72= Ta5d6ff'Ta5d6ff,Ta5d6ff'Tff7b72.Td2a8ffjoinTb4b4b4(Tb4b4b4[Te6edf3iTff7b72.Td2a8ffgroupTb4b4b4(Ta5d6ff'Ta5d6ffcontent_0Ta5d6ff'Tb4b4b4)Tb4b4b4, Te6edf3iTff7b72.Td2a8ffgroupTb4b4b4(Ta5d6ff'Ta5d6ffcontent_1Ta5d6ff'Tb4b4b4)Tb4b4b4]Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3content_line Tff7b72= Te6edf3iTff7b72.Td2a8ffgroupTb4b4b4(Ta5d6ff'Ta5d6ffcontent_0Ta5d6ff'Tb4b4b4)
Te6edf3tokens Tff7b72= Tb4b4b4[Te6edf3xTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4) Tff7b72for Te6edf3x Tff7b72in Te6edf3reTff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff'Ta5d6ff[:,]Ta5d6ff'Tb4b4b4, Te6edf3content_lineTb4b4b4) Tff7b72if Te6edf3xTb4b4b4]
Te6edf3extra_infoTb4b4b4[Tffa657intTb4b4b4(Te6edf3iTff7b72.Td2a8ffgroupTb4b4b4(Ta5d6ff'Ta5d6ffstream_idTa5d6ff'Tb4b4b4)Tb4b4b4)Tb4b4b4] Tff7b72= Te6edf3tokens
Tff7b72return Te6edf3extra_info
Tff7b72def Td2a8ffmediainfo_jsonTb4b4b4(Te6edf3filepathTb4b4b4, Te6edf3read_ahead_limitTff7b72=Tff7b72-T79c0ff1Tb4b4b4)Tb4b4b4:
T8b949e"""Return json dictionary with media info(codec, duration, size, bitrate...) from filepath
"""
Te6edf3prober Tff7b72= Te6edf3get_prober_nameTb4b4b4(Tb4b4b4)
Te6edf3command_args Tff7b72= Tb4b4b4[
Ta5d6ff"Ta5d6ff-vTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffinfoTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ff-show_formatTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ff-show_streamsTa5d6ff"Tb4b4b4,
Tb4b4b4]
Tff7b72tryTb4b4b4:
Te6edf3command_args Tff7b72+Tff7b72= Tb4b4b4[Te6edf3fsdecodeTb4b4b4(Te6edf3filepathTb4b4b4)Tb4b4b4]
Te6edf3stdin_parameter Tff7b72= Tff7b72None
Te6edf3stdin_data Tff7b72= Tff7b72None
Tff7b72except Tf85149TypeErrorTb4b4b4:
Tff7b72if Te6edf3prober Tff7b72== Ta5d6ff'Ta5d6ffffprobeTa5d6ff'Tb4b4b4:
Te6edf3command_args Tff7b72+Tff7b72= Tb4b4b4[Ta5d6ff"Ta5d6ff-read_ahead_limitTa5d6ff"Tb4b4b4, Tffa657strTb4b4b4(Te6edf3read_ahead_limitTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffcache:pipe:0Ta5d6ff"Tb4b4b4]
Tff7b72elseTb4b4b4:
Te6edf3command_args Tff7b72+Tff7b72= Tb4b4b4[Ta5d6ff"Ta5d6ff-Ta5d6ff"Tb4b4b4]
Te6edf3stdin_parameter Tff7b72= Te6edf3PIPE
Te6edf3fileTb4b4b4, Te6edf3close_file Tff7b72= Te6edf3_fd_or_path_or_tempfileTb4b4b4(Te6edf3filepathTb4b4b4, Ta5d6ff'Ta5d6ffrbTa5d6ff'Tb4b4b4, Te6edf3tempfileTff7b72=Tff7b72FalseTb4b4b4)
Te6edf3fileTff7b72.Td2a8ffseekTb4b4b4(T79c0ff0Tb4b4b4)
Te6edf3stdin_data Tff7b72= Te6edf3fileTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3close_fileTb4b4b4:
Te6edf3fileTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Te6edf3command Tff7b72= Tb4b4b4[Te6edf3proberTb4b4b4, Ta5d6ff'Ta5d6ff-ofTa5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ffjsonTa5d6ff'Tb4b4b4] Tff7b72+ Te6edf3command_args
Te6edf3res Tff7b72= Te6edf3PopenTb4b4b4(Te6edf3commandTb4b4b4, Te6edf3stdinTff7b72=Te6edf3stdin_parameterTb4b4b4, Te6edf3stdoutTff7b72=Te6edf3PIPETb4b4b4, Te6edf3stderrTff7b72=Te6edf3PIPETb4b4b4)
Te6edf3outputTb4b4b4, Te6edf3stderr Tff7b72= Te6edf3resTff7b72.Td2a8ffcommunicateTb4b4b4(Tffa657inputTff7b72=Te6edf3stdin_dataTb4b4b4)
Te6edf3output Tff7b72= Te6edf3outputTff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4, Ta5d6ff'Ta5d6ffignoreTa5d6ff'Tb4b4b4)
Te6edf3stderr Tff7b72= Te6edf3stderrTff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4, Ta5d6ff'Ta5d6ffignoreTa5d6ff'Tb4b4b4)
Te6edf3info Tff7b72= Te6edf3jsonTff7b72.Td2a8ffloadsTb4b4b4(Te6edf3outputTb4b4b4)
Tff7b72if Tff7b72not Te6edf3infoTb4b4b4:
T8b949e# If ffprobe didn't give any information, just return it
T8b949e# (for example, because the file doesn't exist)
Tff7b72return Te6edf3info
Te6edf3extra_info Tff7b72= Te6edf3get_extra_infoTb4b4b4(Te6edf3stderrTb4b4b4)
Te6edf3audio_streams Tff7b72= Tb4b4b4[Te6edf3x Tff7b72for Te6edf3x Tff7b72in Te6edf3infoTb4b4b4[Ta5d6ff'Ta5d6ffstreamsTa5d6ff'Tb4b4b4] Tff7b72if Te6edf3xTb4b4b4[Ta5d6ff'Ta5d6ffcodec_typeTa5d6ff'Tb4b4b4] Tff7b72== Ta5d6ff'Ta5d6ffaudioTa5d6ff'Tb4b4b4]
Tff7b72if Tffa657lenTb4b4b4(Te6edf3audio_streamsTb4b4b4) Tff7b72== T79c0ff0Tb4b4b4:
Tff7b72return Te6edf3info
T8b949e# We just operate on the first audio stream in case there are more
Te6edf3stream Tff7b72= Te6edf3audio_streamsTb4b4b4[T79c0ff0Tb4b4b4]
Tff7b72def Td2a8ffset_propertyTb4b4b4(Te6edf3streamTb4b4b4, Te6edf3propTb4b4b4, Te6edf3valueTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3prop Tff7b72not Tff7b72in Te6edf3stream Tff7b72or Te6edf3streamTb4b4b4[Te6edf3propTb4b4b4] Tff7b72== T79c0ff0Tb4b4b4:
Te6edf3streamTb4b4b4[Te6edf3propTb4b4b4] Tff7b72= Te6edf3value
Tff7b72for Te6edf3token Tff7b72in Te6edf3extra_infoTb4b4b4[Te6edf3streamTb4b4b4[Ta5d6ff'Ta5d6ffindexTa5d6ff'Tb4b4b4]Tb4b4b4]Tb4b4b4:
Te6edf3m Tff7b72= Te6edf3reTff7b72.Td2a8ffmatchTb4b4b4(Ta5d6ff'Ta5d6ff([su]([0-9]Ta5d6ff{Ta5d6ff1,2})p?) Ta5d6ff\Ta5d6ff(([0-9]Ta5d6ff{Ta5d6ff1,2}) bitTa5d6ff\Ta5d6ff)$Ta5d6ff'Tb4b4b4, Te6edf3tokenTb4b4b4)
Te6edf3m2 Tff7b72= Te6edf3reTff7b72.Td2a8ffmatchTb4b4b4(Ta5d6ff'Ta5d6ff([su]([0-9]Ta5d6ff{Ta5d6ff1,2})p?)( Ta5d6ff\Ta5d6ff(defaultTa5d6ff\Ta5d6ff))?$Ta5d6ff'Tb4b4b4, Te6edf3tokenTb4b4b4)
Tff7b72if Te6edf3mTb4b4b4:
Te6edf3set_propertyTb4b4b4(Te6edf3streamTb4b4b4, Ta5d6ff'Ta5d6ffsample_fmtTa5d6ff'Tb4b4b4, Te6edf3mTff7b72.Td2a8ffgroupTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4)
Te6edf3set_propertyTb4b4b4(Te6edf3streamTb4b4b4, Ta5d6ff'Ta5d6ffbits_per_sampleTa5d6ff'Tb4b4b4, Tffa657intTb4b4b4(Te6edf3mTff7b72.Td2a8ffgroupTb4b4b4(T79c0ff2Tb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3set_propertyTb4b4b4(Te6edf3streamTb4b4b4, Ta5d6ff'Ta5d6ffbits_per_raw_sampleTa5d6ff'Tb4b4b4, Tffa657intTb4b4b4(Te6edf3mTff7b72.Td2a8ffgroupTb4b4b4(T79c0ff3Tb4b4b4)Tb4b4b4)Tb4b4b4)
Tff7b72elif Te6edf3m2Tb4b4b4:
Te6edf3set_propertyTb4b4b4(Te6edf3streamTb4b4b4, Ta5d6ff'Ta5d6ffsample_fmtTa5d6ff'Tb4b4b4, Te6edf3m2Tff7b72.Td2a8ffgroupTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4)
Te6edf3set_propertyTb4b4b4(Te6edf3streamTb4b4b4, Ta5d6ff'Ta5d6ffbits_per_sampleTa5d6ff'Tb4b4b4, Tffa657intTb4b4b4(Te6edf3m2Tff7b72.Td2a8ffgroupTb4b4b4(T79c0ff2Tb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3set_propertyTb4b4b4(Te6edf3streamTb4b4b4, Ta5d6ff'Ta5d6ffbits_per_raw_sampleTa5d6ff'Tb4b4b4, Tffa657intTb4b4b4(Te6edf3m2Tff7b72.Td2a8ffgroupTb4b4b4(T79c0ff2Tb4b4b4)Tb4b4b4)Tb4b4b4)
Tff7b72elif Te6edf3reTff7b72.Td2a8ffmatchTb4b4b4(Ta5d6ff'Ta5d6ff(flt)p?( Ta5d6ff\Ta5d6ff(defaultTa5d6ff\Ta5d6ff))?$Ta5d6ff'Tb4b4b4, Te6edf3tokenTb4b4b4)Tb4b4b4:
Te6edf3set_propertyTb4b4b4(Te6edf3streamTb4b4b4, Ta5d6ff'Ta5d6ffsample_fmtTa5d6ff'Tb4b4b4, Te6edf3tokenTb4b4b4)
Te6edf3set_propertyTb4b4b4(Te6edf3streamTb4b4b4, Ta5d6ff'Ta5d6ffbits_per_sampleTa5d6ff'Tb4b4b4, T79c0ff32Tb4b4b4)
Te6edf3set_propertyTb4b4b4(Te6edf3streamTb4b4b4, Ta5d6ff'Ta5d6ffbits_per_raw_sampleTa5d6ff'Tb4b4b4, T79c0ff32Tb4b4b4)
Tff7b72elif Te6edf3reTff7b72.Td2a8ffmatchTb4b4b4(Ta5d6ff'Ta5d6ff(dbl)p?( Ta5d6ff\Ta5d6ff(defaultTa5d6ff\Ta5d6ff))?$Ta5d6ff'Tb4b4b4, Te6edf3tokenTb4b4b4)Tb4b4b4:
Te6edf3set_propertyTb4b4b4(Te6edf3streamTb4b4b4, Ta5d6ff'Ta5d6ffsample_fmtTa5d6ff'Tb4b4b4, Te6edf3tokenTb4b4b4)
Te6edf3set_propertyTb4b4b4(Te6edf3streamTb4b4b4, Ta5d6ff'Ta5d6ffbits_per_sampleTa5d6ff'Tb4b4b4, T79c0ff64Tb4b4b4)
Te6edf3set_propertyTb4b4b4(Te6edf3streamTb4b4b4, Ta5d6ff'Ta5d6ffbits_per_raw_sampleTa5d6ff'Tb4b4b4, T79c0ff64Tb4b4b4)
Tff7b72return Te6edf3info
Tff7b72def Td2a8ffmediainfoTb4b4b4(Te6edf3filepathTb4b4b4)Tb4b4b4:
T8b949e"""Return dictionary with media info(codec, duration, size, bitrate...) from filepath
"""
Te6edf3prober Tff7b72= Te6edf3get_prober_nameTb4b4b4(Tb4b4b4)
Te6edf3command_args Tff7b72= Tb4b4b4[
Ta5d6ff"Ta5d6ff-vTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffquietTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ff-show_formatTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ff-show_streamsTa5d6ff"Tb4b4b4,
Te6edf3filepath
Tb4b4b4]
Te6edf3command Tff7b72= Tb4b4b4[Te6edf3proberTb4b4b4, Ta5d6ff'Ta5d6ff-ofTa5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ffoldTa5d6ff'Tb4b4b4] Tff7b72+ Te6edf3command_args
Te6edf3res Tff7b72= Te6edf3PopenTb4b4b4(Te6edf3commandTb4b4b4, Te6edf3stdoutTff7b72=Te6edf3PIPETb4b4b4)
Te6edf3output Tff7b72= Te6edf3resTff7b72.Td2a8ffcommunicateTb4b4b4(Tb4b4b4)Tb4b4b4[T79c0ff0Tb4b4b4]Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Tff7b72if Te6edf3resTff7b72.Td2a8ffreturncode Tff7b72!= T79c0ff0Tb4b4b4:
Te6edf3command Tff7b72= Tb4b4b4[Te6edf3proberTb4b4b4] Tff7b72+ Te6edf3command_args
Te6edf3output Tff7b72= Te6edf3PopenTb4b4b4(Te6edf3commandTb4b4b4, Te6edf3stdoutTff7b72=Te6edf3PIPETb4b4b4)Tff7b72.Td2a8ffcommunicateTb4b4b4(Tb4b4b4)Tb4b4b4[T79c0ff0Tb4b4b4]Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Te6edf3rgx Tff7b72= Te6edf3reTff7b72.Td2a8ffcompileTb4b4b4(Ta5d6ffrTa5d6ff"Ta5d6ff(?:(?P<inner_dict>.*?):)?(?P<key>.*?)Ta5d6ff\Ta5d6ff=(?P<value>.*?)$Ta5d6ff"Tb4b4b4)
Te6edf3info Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72if Te6edf3sysTff7b72.Td2a8ffplatform Tff7b72== Ta5d6ff'Ta5d6ffwin32Ta5d6ff'Tb4b4b4:
Te6edf3output Tff7b72= Te6edf3outputTff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff"Tffea00\rTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tff7b72for Te6edf3line Tff7b72in Te6edf3outputTff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)Tb4b4b4:
T8b949e# print(line)
Te6edf3mobj Tff7b72= Te6edf3rgxTff7b72.Td2a8ffmatchTb4b4b4(Te6edf3lineTb4b4b4)
Tff7b72if Te6edf3mobjTb4b4b4:
T8b949e# print(mobj.groups())
Te6edf3inner_dictTb4b4b4, Te6edf3keyTb4b4b4, Te6edf3value Tff7b72= Te6edf3mobjTff7b72.Td2a8ffgroupsTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3inner_dictTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3infoTb4b4b4[Te6edf3inner_dictTb4b4b4]
Tff7b72except Tf85149KeyErrorTb4b4b4:
Te6edf3infoTb4b4b4[Te6edf3inner_dictTb4b4b4] Tff7b72= Tb4b4b4{Tb4b4b4}
Te6edf3infoTb4b4b4[Te6edf3inner_dictTb4b4b4]Tb4b4b4[Te6edf3keyTb4b4b4] Tff7b72= Te6edf3value
Tff7b72elseTb4b4b4:
Te6edf3infoTb4b4b4[Te6edf3keyTb4b4b4] Tff7b72= Te6edf3value
Tff7b72return Te6edf3info
Tff7b72def Td2a8ffcache_codecsTb4b4b4(Te6edf3functionTb4b4b4)Tb4b4b4:
Te6edf3cache Tff7b72= Tb4b4b4{Tb4b4b4}
Tf0883e@wrapsTb4b4b4(Te6edf3functionTb4b4b4)
Tff7b72def Td2a8ffwrapperTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72return Te6edf3cacheTb4b4b4[T79c0ff0Tb4b4b4]
Tff7b72exceptTb4b4b4:
Te6edf3cacheTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72= Te6edf3functionTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3cacheTb4b4b4[T79c0ff0Tb4b4b4]
Tff7b72return Te6edf3wrapper
Tf0883e@cache_codecs
Tff7b72def Td2a8ffget_supported_codecsTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3encoder Tff7b72= Te6edf3get_encoder_nameTb4b4b4(Tb4b4b4)
Te6edf3command Tff7b72= Tb4b4b4[Te6edf3encoderTb4b4b4, Ta5d6ff"Ta5d6ff-codecsTa5d6ff"Tb4b4b4]
Te6edf3res Tff7b72= Te6edf3PopenTb4b4b4(Te6edf3commandTb4b4b4, Te6edf3stdoutTff7b72=Te6edf3PIPETb4b4b4, Te6edf3stderrTff7b72=Te6edf3PIPETb4b4b4)
Te6edf3output Tff7b72= Te6edf3resTff7b72.Td2a8ffcommunicateTb4b4b4(Tb4b4b4)Tb4b4b4[T79c0ff0Tb4b4b4]Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Tff7b72if Te6edf3resTff7b72.Td2a8ffreturncode Tff7b72!= T79c0ff0Tb4b4b4:
Tff7b72return Tb4b4b4[Tb4b4b4]
Tff7b72if Te6edf3sysTff7b72.Td2a8ffplatform Tff7b72== Ta5d6ff'Ta5d6ffwin32Ta5d6ff'Tb4b4b4:
Te6edf3output Tff7b72= Te6edf3outputTff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff"Tffea00\rTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4)
Te6edf3rgx Tff7b72= Te6edf3reTff7b72.Td2a8ffcompileTb4b4b4(Ta5d6ffrTa5d6ff"Ta5d6ff^([D.][E.][AVS.][I.][L.][S.]) (Ta5d6ff\Ta5d6ffw*) +(.*)Ta5d6ff"Tb4b4b4)
Te6edf3decoders Tff7b72= Tffa657setTb4b4b4(Tb4b4b4)
Te6edf3encoders Tff7b72= Tffa657setTb4b4b4(Tb4b4b4)
Tff7b72for Te6edf3line Tff7b72in Te6edf3outputTff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff'Tffea00\nTa5d6ff'Tb4b4b4)Tb4b4b4:
Te6edf3match Tff7b72= Te6edf3rgxTff7b72.Td2a8ffmatchTb4b4b4(Te6edf3lineTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3matchTb4b4b4:
Tff7b72continue
Te6edf3flagsTb4b4b4, Te6edf3codecTb4b4b4, Te6edf3name Tff7b72= Te6edf3matchTff7b72.Td2a8ffgroupsTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3flagsTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72== Ta5d6ff'Ta5d6ffDTa5d6ff'Tb4b4b4:
Te6edf3decodersTff7b72.Td2a8ffaddTb4b4b4(Te6edf3codecTb4b4b4)
Tff7b72if Te6edf3flagsTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72== Ta5d6ff'Ta5d6ffETa5d6ff'Tb4b4b4:
Te6edf3encodersTff7b72.Td2a8ffaddTb4b4b4(Te6edf3codecTb4b4b4)
Tff7b72return Tb4b4b4(Te6edf3decodersTb4b4b4, Te6edf3encodersTb4b4b4)
Tff7b72def Td2a8ffget_supported_decodersTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3get_supported_codecsTb4b4b4(Tb4b4b4)Tb4b4b4[T79c0ff0Tb4b4b4]
Tff7b72def Td2a8ffget_supported_encodersTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3get_supported_codecsTb4b4b4(Tb4b4b4)Tb4b4b4[T79c0ff1Tb4b4b4]
Tff7b72def Td2a8ffstereo_to_msTb4b4b4(Te6edf3audio_segmentTb4b4b4)Tb4b4b4:
T8b949e'''
Left-Right -> Mid-Side
'''
Te6edf3channel Tff7b72= Te6edf3audio_segmentTff7b72.Td2a8ffsplit_to_monoTb4b4b4(Tb4b4b4)
Te6edf3channel Tff7b72= Tb4b4b4[Te6edf3channelTb4b4b4[T79c0ff0Tb4b4b4]Tff7b72.Td2a8ffoverlayTb4b4b4(Te6edf3channelTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4)Tb4b4b4, Te6edf3channelTb4b4b4[T79c0ff0Tb4b4b4]Tff7b72.Td2a8ffoverlayTb4b4b4(Te6edf3channelTb4b4b4[T79c0ff1Tb4b4b4]Tff7b72.Td2a8ffinvert_phaseTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4]
Tff7b72return Te6edf3AudioSegmentTff7b72.Td2a8fffrom_mono_audiosegmentsTb4b4b4(Te6edf3channelTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4, Te6edf3channelTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4)
Tff7b72def Td2a8ffms_to_stereoTb4b4b4(Te6edf3audio_segmentTb4b4b4)Tb4b4b4:
T8b949e'''
Mid-Side -> Left-Right
'''
Te6edf3channel Tff7b72= Te6edf3audio_segmentTff7b72.Td2a8ffsplit_to_monoTb4b4b4(Tb4b4b4)
Te6edf3channel Tff7b72= Tb4b4b4[Te6edf3channelTb4b4b4[T79c0ff0Tb4b4b4]Tff7b72.Td2a8ffoverlayTb4b4b4(Te6edf3channelTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4) Tff7b72- T79c0ff3Tb4b4b4, Te6edf3channelTb4b4b4[T79c0ff0Tb4b4b4]Tff7b72.Td2a8ffoverlayTb4b4b4(Te6edf3channelTb4b4b4[T79c0ff1Tb4b4b4]Tff7b72.Td2a8ffinvert_phaseTb4b4b4(Tb4b4b4)Tb4b4b4) Tff7b72- T79c0ff3Tb4b4b4]
Tff7b72return Te6edf3AudioSegmentTff7b72.Td2a8fffrom_mono_audiosegmentsTb4b4b4(Te6edf3channelTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4, Te6edf3channelTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4)
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────